import { Request } from 'express';
import { IConstant_Enum_Type_UserAdmin_Status } from '../constants/enum';
/**
 * 通用 JWT 负载类型，包含用户名、用户 ID 和用户状态。
 * @type {object}
 * @property {string} userName - 用户名。
 * @property {number} userId - 用户 ID。
 * @property {IConstant_Enum_Type_UserAdmin_Status} statusUser - 用户状态。
 */
type IUserCommon_JwtStrategyPayloaded = {
  userName: string;
  userId: number;
  statusUser: IConstant_Enum_Type_UserAdmin_Status;
};
/**
 * 后台 JWT 负载类型，包含通用 JWT 负载字段和后台特有的类型字段。
 * @type {object}
 * @property {'adm'} type - 用户类型，固定为 'adm'。
 */
export type IUserAdmin_JwtStrategyPayload = { type: 'adm' } & IUserCommon_JwtStrategyPayloaded;

/**
 * 微信登录 JWT 策略有效载荷类型。
 * @type {object}
 * @property {number} id - 用户的唯一标识符。
 * @property {string} openid - 用户的微信 OpenID。
 * @property {'webWx'} type - 登录类型，固定值为 'webWx'。
 */
export type IWxLogin_JwtStrategyPayloaded = {
  userId: number;
  openid: string;
  type: 'webWx';
  statusUser?: IConstant_Enum_Type_UserAdmin_Status;
};

/**
 * Web 用户 JWT 负载类型，包含通用 JWT 负载字段和 Web 用户特有的字段（电话和邮箱）。
 * @type {object}
 * @property {'web'} type - 用户类型，固定为 'web'。
 * @property {number} phone - 用户电话。
 * @property {string} email - 用户邮箱。
 */
export type IUserClient_JwtStrategyPayload = IUserCommon_JwtStrategyPayloaded & {
  type: 'web';
  phone: number;
  email: string;
};

/**
 * JWT 负载类型，可以是后台或 Web 用户的 JWT 负载类型。
 * @type {IUserAdmin_JwtStrategyPayload | IUserClient_JwtStrategyPayload |IWxLogin_JwtStrategyPayloaded}
 */
export type IJwtStrategyPayload =
  | IUserAdmin_JwtStrategyPayload
  | IUserClient_JwtStrategyPayload
  | IWxLogin_JwtStrategyPayloaded;

/**
 * 扩展的请求对象类型，包含用户信息。
 * @type {object}
 * @property {IJwtStrategyPayload} user - 包含用户信息的 JWT 负载。
 */
export type IRequest = Request & { user: IJwtStrategyPayload };
